// 全局封装的功能函数
// 导入相关的内容
// 0-1. 内置包
import promptAction from '@ohos.promptAction'
import router from '@ohos.router'
import geoLocationManager from '@ohos.geoLocationManager'
import picker from '@ohos.file.picker'
// 0-2. 类型约束
import { JumpOptionsType } from '../model/tools'
// 0-3. 相关组件
// 0-4. 相关配置
import { latitude, longitude } from '../config/index'

// 1. 封装 jump 函数

export function jump(options: JumpOptionsType) {
  // 1-1. 解构拿到 options 内的值

  let { url, state = false, history = true, params = {}, duration = 0, message = '', bottom = 100 } = options


  // 1-2. 决定是否展示 toast
  if (state) {
    promptAction.showToast({ message, duration, bottom })
  }

  // 1-3. 进行路由跳转
  setTimeout(() => {
    if (history) {
      router.pushUrl({ url, params })
    }
    router.replaceUrl({ url, params })
  }, duration)
}

// 返回相关的封装
jump.back = function () {
  router.back()
}

//获取地理位置的功能函数
export function getLocationInfo(): Promise<{ code: number, message: string, origin?: any, compile?: any, duration?: number }> {
  const location  = geoLocationManager.getLastLocation()

  // 将信息进行转化
  return new Promise(resolve => {
    geoLocationManager.getAddressesFromLocation({ ...location, locale: 'zh' }, (err, data) => {
      if (err) {
        resolve({
          code: 0,
          message: '获取地理位置失败, 请检查终端定位是否开启'
        })
      } else {
        resolve({
          code: 1,
          message: '获取地理位置成功',
          origin: location,
          compile: data[0],
          duration: countDuration(6371, latitude, longitude, data[0].latitude, data[0].longitude)
        })
      }
    })
  })
}
//换算位置( 两个经纬度之间的位置关系 )
export function countDuration(r: number, originLat: number, originLon: number, currentLat: number, currentLon: number): number {
  // 计算
  // 计算球面两个点之间的距离公式
  //   duration = arccon( sin(纬度1) * sin(纬度2) + con(纬度1) * cos(纬度2) * cos(经度1 - 经度2) ) * 球体半径
  // 所有拿到的经纬度是角度, 我们 JS 内所有的计算需要使用 弧度
  // 弧度转角度公式
  //   deg = rad * π / 180
  originLat = originLat * Math.PI / 180
  originLon = originLon * Math.PI / 180
  currentLat = currentLat * Math.PI / 180
  currentLon = currentLon * Math.PI / 180
  const duration: number = r * Math.acos( Math.sin(originLat) * Math.sin(currentLat) + Math.cos(originLat) * Math.cos(currentLat) * Math.cos(originLon - currentLon) )

  return duration
}
// 格式化时间
export function formatTime(time): string {
  // 规则自己指定
  // 刚刚             60 秒以内
  // xx 分钟以前       60 分钟以内
  // xx 天以前         3 天以内
  // 显示年月日        3 天以上
  let str: string = ''

  // 1. 拿到当前时间
  const currentTime: Date = new Date()
  // 2. 目标时间
  const targetTime: Date = new Date(time)

  // 3. 拿到时间差
  const diffTime: number = Math.ceil((currentTime.getTime() - targetTime.getTime()) / 1000)

  // 4. 条件判断
  if (diffTime < 60) {
    str = '刚刚'
  } else if (diffTime < 60 * 60) {
    str = Math.ceil(diffTime / 60) + '分钟前'
  } else if (diffTime < 60 * 60 * 24 * 3) {
    str = Math.floor(diffTime / 60 / 60 / 24) + '天前'
  } else {
    str = time.split(' ')[0]
  }

  console.log(
    `
      currentTime : ${ currentTime } \n
      targetTime : ${ targetTime } \n
      diffTime : ${ diffTime }
    `
  )


  return str
}